#import "SimpleTreeNode.h"

#define KEY_GROUPNAME	@"Group"
#define KEY_ENTRIES		@"Entries"


@implementation SimpleNodeData

- (id)initWithName:(NSString*)str isLeaf:(BOOL)leaf
{
    self = [super init];
    if (self==nil) return nil;
    name = [str retain];
    isLeaf = leaf;
    iconRep = nil;
    isExpandable = !isLeaf;
    
    return self;
}

+ (id)leafDataWithName:(NSString*)str
{
    // Convenience method to return a leaf node with its name set.
    return [[[SimpleNodeData alloc] initWithName:str isLeaf:YES] autorelease];
}

+ (id)groupDataWithName:(NSString*)str
{
    // Convenience method to return a branch node with its name set.
    return [[[SimpleNodeData alloc] initWithName:str isLeaf:NO] autorelease];
}

- (void)dealloc
{
    [name release];
    [iconRep release];
    name = nil;
    iconRep = nil;
    [super dealloc];
}

- (id)copyWithZone:(NSZone *)zone {
	return [self retain];
}

- (void)setName:(NSString *)str
{ 
    if (!name || ![name isEqualToString: str])
	{
	[name release]; 
	name = [str retain]; 
    }
}

- (NSString*)name
{ 
    return name; 
}

- (void)setIsLeaf:(BOOL)leaf
{ 
    isLeaf = leaf; 
}

- (BOOL)isLeaf
{ 
    return isLeaf; 
}

- (BOOL)isGroup
{ 
    return !isLeaf; 
}

- (void)setIconRep:(NSImage*)ir
{
    if (!iconRep || ![iconRep isEqual: ir])
	{
		[iconRep release];
		iconRep = [ir retain];
    }
}
- (NSImage*)iconRep
{
    return iconRep;
}

- (void)setIsExpandable: (BOOL)expandable
{
    isExpandable = expandable;
}

- (BOOL)isExpandable
{
    return isExpandable;
}

- (NSString*)description
{ 
    return name; 
}

- (NSComparisonResult)compare:(TreeNodeData*)other
{
    // We want the data to be sorted by name, so we compare [self name] to [other name]
    SimpleNodeData *_other = (SimpleNodeData *)other;
    return [name compare: [_other name]];
}

@end

@implementation SimpleTreeNode

- (id) initFromDictionary:(NSDictionary*)dict
{
    // This is a convenience init method to return a tree root of a tree derived from an input dictionary.
    // The input dictionary for this example app is InitInfo.dict.  Look at that file to understand the format.
    SimpleNodeData *data = [SimpleNodeData groupDataWithName: [dict objectForKey: KEY_GROUPNAME]];
    NSEnumerator *entryEnum = [[dict objectForKey: KEY_ENTRIES] objectEnumerator];
    id entry;
    SimpleTreeNode *child = nil;
    
    self = [super initWithData:data parent:nil children:[NSArray array]];
    if (self==nil) return nil;
    
    while ((entry=[entryEnum nextObject]))
	{
        if ([entry isKindOfClass: [NSDictionary class]])
            child = [SimpleTreeNode treeFromDictionary: entry];
        else 
            child = [[[SimpleTreeNode alloc] initWithData:[SimpleNodeData leafDataWithName:entry] parent:nil children: [NSArray array]] autorelease];
        [self insertChild: child atIndex: [self numberOfChildren]];
    }
    
    return self;
}

+ (id) treeFromDictionary:(NSDictionary*)dict
{
    return [[[SimpleTreeNode alloc] initFromDictionary:dict] autorelease];
}

- (id)copyWithZone:(NSZone *)zone {
	return [self retain];
}

@end

